#include <iostream>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
#include <sys/syscall.h> // 仅仅是了解
using namespace std;


//int global_value = 100;
__thread int global_value = 100;
void *startRoutine(void *args)
{
    while (true)
    {
        cout << "thread " << pthread_self() << " global_value: "
             << global_value << " &global_value: " << &global_value
             << " Inc: " << global_value++ << " lwp: " << ::syscall(SYS_gettid) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid1;
    pthread_t tid2;
    pthread_t tid3;

    pthread_create(&tid1, nullptr, startRoutine, (void *)"thread 1");
    pthread_create(&tid2, nullptr, startRoutine, (void *)"thread 2");
    pthread_create(&tid3, nullptr, startRoutine, (void *)"thread 3");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);

    return 0;
}



//#include <sys/syscall.h> // 仅仅是了解
//__thread int global_value = 100;

//test5
// static void printTid(const char *name, const pthread_t &tid)
// {
//     printf("%s 正在运行,thread id: 0x%x\n", name, tid);
// }
// void *startRoutine(void *args)
// {
//     const char *name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (true)
//     {
//         printTid(name, pthread_self());
//         sleep(1);
//         if (!(cnt--))
//         {
//            // break;
//         }
//     }
//     cout << "线程退出！" << endl;
//     // 线程退出方式：
//     // 1.return
//     //return (void *)10;
//     //2.pthread_exit
//     //pthread_exit((void*)9999);
//     //3.pthread_cancle

// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread 1");
//     (void)n;
//     sleep(3);  //代表main thread 对应的工作
//     pthread_cancel(tid);
//     cout<<" new thread been canceled"<<endl;
//     void *ret = nullptr; // void **retval是一个输出型参数
//     pthread_join(tid, &ret);
//     cout << "main thread join success!  *ret: " << (long long)ret << endl;
//     sleep(1);
//     while (true)
//     {
//         printTid("main thread", pthread_self());
//         sleep(1);
//     }
//     return 0;
// }




//test4
// static void printTid(const char *name, const pthread_t &tid)
// {
//     printf("%s 正在运行,thread id: 0x%x\n", name, tid);
// }
// void *startRoutine(void *args)
// {
//     const char *name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (true)
//     {
//         printTid(name, pthread_self());
//         sleep(1);
//         if (!(cnt--))
//             break;
//     }
//     cout << "线程退出！" << endl;
//     // 线程退出方式：
//     // 1.return
//     return (void *)10;
// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread 1");
//     (void)n;
//     // sleep(1);
//     void *ret = nullptr; // void **retval是一个输出型参数
//     pthread_join(tid, &ret);
//     cout << "main thread join success!  *ret: " << (long long)ret << endl;
//     sleep(1);
//     while (true)
//     {
//         printTid("main thread", pthread_self());
//         sleep(1);
//     }
//     return 0;
// }










//test3
// static void printTid(const char *name, const pthread_t &tid)
// {
//     printf("%s 正在运行,thread id: 0x%x\n", name, tid);
// }
// void *startRoutine(void *args)
// {
//     const char *name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (true)
//     {
//         printTid(name, pthread_self());
//         sleep(1);
//         if (!(cnt--))
//             break;
//     }
//     cout << "线程退出！" << endl;
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread 1");
//     sleep(5);
//     pthread_join(tid, nullptr);
//     cout<<"main thread join success!"<<endl;
//     sleep(5);
//     while (true)
//     {
//         printTid("main thread" ,pthread_self());
//         sleep(1);
//     }
//     return 0;
// }





//test2
// static void  printTid(const char* name,const pthread_t &tid)
// {
//     printf("%s 正在运行,thread id: 0x%x\n",name,tid);
// }
// void *startRoutine(void *args)
// {
//     const char* name = static_cast<const char *>(args);
//     while (true)
//     {
//         //cout << "线程正在运行..." << endl;
//         printTid(name,pthread_self());
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread 1");
//     //cout << "new thread id: " << tid << endl;   //线程id
    // while (true)
    // {
    //     //cout << " main thread 正在运行..." << endl;
    //     printTid("main thread" ,pthread_self());
    //     sleep(1);
    // }
//     return 0;
// }






//test1
// void *startRoutine(void *args)
// {
//     while (true)
//     {
//         cout << "线程正在运行..." << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, startRoutine, (void *)"thread 1");
//     cout << "new thread id: " << tid << endl;   //线程id
//     while (true)
//     {
//         cout << " main thread 正在运行..." << endl;
//         sleep(1);
//     }
//     return 0;
// }